/*
 * Copyright (C), 2002-2018, 苏宁易购电子商务有限公司
 * FileName: package-info.java
 * Author:   88383079
 * Date:     2018年1月4日 上午10:49:44
 * Description: //模块目的、功能描述
 * History: //修改记录
 * <author>      <time>      <version>    <desc>
 * 修改人姓名             修改时间            版本号                  描述
 */
/**
 * 〈一句话功能简述〉<br>
 * 〈功能详细描述〉
 *
 * @author 88383079
 * @see [相关类/方法]（可选）
 * @since [产品/模块版本] （可选）
 */
package fun.codedesign.principle.pattern33.a001.factory;

/**
 * 工厂模式
 * 属于创建型设计模式，需要生成的对象叫做产品 ，生成对象的地方叫做工厂 
 *
 * 类型：
 * 1. 简单静态工厂模式
 * 特点:
 * (1) 它是一个具体的类，非接口 抽象类。有一个重要的create()方法，利用if或者 switch创建产品并返回。
 * (2) create()方法通常是静态的，所以也称之为静态工厂。
 * 缺点:
 * (1)扩展性差（我想增加一种面条，除了新增一个面条产品类，还需要修改工厂类方法）
 * (2)不同的产品需要不同额外参数的时候 不支持。
 *
 *
 * 2.简单反射工厂
 *
 *  特点:
 *  (1) 它也是一个具体的类，非接口 抽象类。但它的create()方法，是利用反射机制生成对象返回，好处是增加一种产品时，不需要修改create()的代码。
 *  缺点:
 *  这种写法粗看牛逼，细想之下，不谈reflection的效率还有以下问题：
 *  (1) 个人觉得不好，因为Class.forName(clz.getName()).newInstance()调用的是无参构造函数生成对象，它和new Object()是一样的性质，
 *  而工厂方法应该用于复杂对象的初始化 ，当需要调用有参的构造函数时便无能为力了，这样像为了工厂而工厂。
 *  (2) 不同的产品需要不同额外参数的时候 不支持。
 *
 *
 * 3. 多方法工厂，为每一个产品创建一个方法，直接显示表明是哪一种noodles;
 *
 *
 * 4. 普通工厂
 * 	将抽象工厂和简单工厂分离开来
 *  每次增加产品都需要新增一个factory， 有点麻烦，不如3 方法
 *
 *
 * 5. 多产品抽象工厂，不仅卖面还卖饮料
 *
 */
